import pandas as pd
import numpy as np
import sklearn
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Lasso
from sklearn.metrics import mean_squared_error
Krzysztof Wolny \ Wstep do uczenia maszynowego - semestr letni 2021\ Eksploracja zbioru danych ze strony: https://www.apispreadsheets.com/datasets/129
# wczytujemy atrybuty badanej bazy danych
atributes_df = pd.read_csv('attributes_forest_fires.csv')
# wyswietlamy zawartość
pd.set_option('max_colwidth',100) #ustawiamy większą szerokość tabeli
atributes_df
# wczytujemy dane
forest_fires_df = pd.read_csv('forest_fires_dataset.csv')
# patrzymy na pierwsze wyniki
pd.reset_option('^display.', silent=True)#resetujemy wcześniejsze ustawienia
forest_fires_df.head()
Widzimy, że mamy dużo danych liczbowych. W zmiennych area i rain widzimy dużo zer co może skazywać na rozkład wykładniczy.
# przyjżyjmy się danym bliżej
forest_fires_df.info()
Dane są pełne i nie posiadają żadnych null-i.
forest_fires_df.describe()
W zmiennej area widzimy, że rzeczywiście mamy bardzo dużo zer, bo co najmniej 25% wyników. Wartości rosną wolno, ale dochodza do dużych liczb, bo aż do powyżej 1000. Podobne cechy widzimy w zmiennej rain. Powyżej 75% wartości są zerami, ale największa wartość wynosi 6.4.
forest_fires_df.hist(figsize=(18, 12), bins=30)
plt.show()
Znowu patrząc na zmienne rain i area potwierdzają się przypuszczenia, że te zmienne mają rozkład wykładniczy. \ Pozostałe zmienne mają rozkład normalny skośny.
# scatterploty przedstawiające zależność między czynnikiem area i innymi zmiennymi.
sns.pairplot(forest_fires_df, y_vars="area", x_vars=forest_fires_df.columns.values[4:9])
sns.pairplot(forest_fires_df, y_vars=forest_fires_df.columns.values[-1], x_vars=forest_fires_df.columns.values[9:12])
plt.show()
Przedstawione wykresy są trochę "puste". Można spróbować przedstawić te wykresy ze skalą logarytmiczną.
# Przygotowanie zbioru treningowego oraz testowego
X_train, X_test, y_train, y_test = train_test_split(
forest_fires_df[forest_fires_df.columns.values[:-1]],
forest_fires_df[forest_fires_df.columns.values[-1]],
test_size=0.33, random_state=22)
# spróbujmy zrobić wykresy ze skalą logarytmiczną
X_train["log_area"] = np.log1p(y_train)
sns.pairplot(X_train, y_vars="log_area", x_vars=X_train.columns.values[4:9])
sns.pairplot(X_train, y_vars="log_area", x_vars=X_train.columns.values[9:12])
plt.show()
Wykresy ze skalą logarytmiczną wyglądają dużo lepiej i bardziej zapełniją wykres. \ Nie widać jednak żadnych wyraźnych zależności między area i innymi zmiennymi. Jedynie przy wykresie z temperaturą widać delikatną korelację. Możemy się temu przyjrzeć.
def plot_linear_model(x, y):
m = LinearRegression()
m.fit(x.values.reshape(-1, 1), y.values.reshape(-1, 1))
y_hat = m.predict(x.values.reshape(-1, 1))
plt.figure(figsize=(8, 5))
plt.scatter(x, y)
plt.plot(x, y_hat, c='red')
plt.show()
plt.close('all')
print(f'RMSE: {np.sqrt(mean_squared_error(y, y_hat)):.3f}')
plot_linear_model(X_train["temp"], np.log1p(y_train))
Nie widać na wykresie wyraźnej zależności liniowej. Przy wzroście temperatury można jednak zauważyć delikatny wzrost zmiennej area.
Dalej możemy sprawdzić, w których miesiącach wystepują największe pożary.
monthly = forest_fires_df.groupby('month')['area'].sum()
Months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
sns.barplot(x = monthly.keys(), y=monthly, order=Months, color='grey')
Z wykresu możemy odczytać, że najwięcej las pali się w okresie letnim. \ Występuje również wzrost pożarów na początku wiosny.
Teraz sprawdźmy jakie są zalżności dni tygodnia ze spaloną powierzchnią lasu.
weekly = forest_fires_df.groupby('day')['area'].sum()
days = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
sns.barplot(x = weekly.keys(), y=weekly, order=days, color='grey')
plt.show()
Z wykresu wynika, że w soboty najwięcej lasu zostaje spalone.
Do automatycznej eksploracji danych użyję pandas-profiling.
from pandas_profiling import ProfileReport
profile = ProfileReport(forest_fires_df, title="Pandas Profiling Report")
profile
Po pierwsze nie można zmienić kolejności wyswietlanych informacji. Zazwyczaj warto zobaczyć na jakich danych się pracuje i przejrzeć kilka pierwszych elementów zanim zacznie się patrzeć na rozkłady. \ Oprócz tego w analizie pojawia nam się mnóstwo zbędnych informacji, co sprawia, że ciężko jest odnaleźć wartościowe informacje.